# - inputs: none
# - outputs: all sources coming from data, research and guesswork
chunk_sources <- function(){
###############################################################################
###############################################################################
#############
##### Setup
#############
nsims_so <- 1e2
policy_estimate_so <- "Main Equation"
rescale_so <- TRUE
#############
##### Data
#############
# Create objects for data extracted from various sources
r_input1_so <- 0.1
r_input2_so <- 0.2
#############
##### Research
#############
# Create objects for parameters extracted from research papers
q_input1_so <- 0.5
q_input2_so <- 0.8
#############
##### Guess work
#############
# Create objects for variables from educated guesses or estimates
#############
##### Notes:
#############
# Notes for the objects defined above, including sources, explanations, etc.
k_input1_so <- 3
k_input2_so <- 4
#return( sapply( ls(pattern= "_so\\b"), function(x) get(x)) )
return (
list("nsims_so" = nsims_so,
"policy_estimate_so" = policy_estimate_so,
"rescale_so" = rescale_so,
"r_input1_so" = r_input1_so,
"r_input2_so" = r_input2_so,
"q_input1_so" = q_input1_so,
"q_input2_so" = q_input2_so,
"k_input1_so" = k_input1_so,
"k_input2_so" = k_input2_so
)
)
}
invisible(list2env(chunk_sources(),.GlobalEnv) )
Introduction
Summary of the issue and introduction to the policy analysis is conducted.
The goal of this analysis is to provide the best empirical information for policy makers debating the implemention of “x” policy. This document describes all the analytical steps required to reproduce the analysis, and displaying the actual computer code use in each step. In addition to this report, the reader can find all the materials to reproduce the findings presented here in GitHub. The main output, presented in the results section of this report, can also be explored interactively for different assumptions on the corresponding shiny app.
Key policy estimates for policy makers
???
Methodology
Explain what the final estimate indicator is, how the analysis is to be performed, what factors are looked at, etc.
Common Structure
Introduce the starting point and the final policy estimate. Include alternative indicators of our final policy estimates as well.
Main Equation (the model)
\[\begin{equation}
y = r + q - k
\label{eq:1}
\tag{1}
\end{equation}\]
Alternative Equation
\[\begin{equation}
y = r + q + k
\label{eq:2}
\tag{2}
\end{equation}\]
Sub Common Components:
Component 1 (“\(r\)”)
This is the formula used to calculate component 1
\[\begin{equation}
r = X \times \lambda_1 + (1 - X) \times \lambda_2
\label{eq:3}
\tag{3}
\end{equation}\]
Approach 1: Source Name (source link)
Component 2 (“\(q\)”)
This is the formula used to calculate component 2
\[\begin{equation}
q = \text{input} \times \alpha_0 (1 + g)^{X}(1 + \hat{\beta_1} X + \hat{\beta_2} X^2)
\label{eq:}
\tag{4}
\end{equation}\]
Approach 2: Source Name (source link)
Component 3 (“\(k\)”)
This is the formula used to calculate component 3
\[\begin{equation}
k = R \times X + (1 - R) \times X
\label{eq:5}
\tag{5}
\end{equation}\]
Summary of All Approaches
| 1.1 |
Specification of Approach 1 with Part 1 Assumption 1 |
Specification of Approach 1 with Part 2 Assumption 1 |
| 1.2 |
Specification of Approach 1 with Part 1 Assumption 2 |
Specification of Aprroach 1 with Part 2 Assumption 2 |
| 2.1 |
Specification of Approach 2 with Part 1 Assumption 1 |
Specification of Approach 2 with Part 2 Assumption 1 |
| 2.2 |
Specification of Approach 2 with Part 1 Assumption 2 |
Specification of Approach 2 with Part 2 Assumption 2 |
Bolded row is the assumptions and the approach we use to generate the main policy estimate plot.
Main results
#unit test function
unit_test_f <- function(to_test_var, original_var, main_run_var = TRUE){
if (main_run_var == TRUE) {
if (length(to_test_var) > 1) {
fails_test <- ( abs(sd(to_test_var) - original_var) > 0.0001 )
text_val <- sd(to_test_var)
} else {
fails_test <- ( abs(to_test_var - original_var) > 0.0001 )
text_val <- to_test_var
}
if (fails_test) {
print(paste("Output has change at",
deparse(substitute(to_test_var) ),
" to ", text_val) )
}
}
}
one_run <-
function(r_input1_var1 = r_input1_so,
r_input2_var1 = r_input2_so,
q_input1_var1 = q_input1_so,
q_input2_var1 = q_input2_so,
k_input1_var1 = k_input1_so,
k_input2_var1 = k_input2_so){# Variables needed to generate the final policy estimates
r_in <- r_function_f(r_input1_var = r_input1_var1,
r_input2_var = r_input2_var1)
q_in <- q_function_f(q_input1_var = q_input1_var1,
q_input2_var = q_input2_var1)
k_in <- k_function_f(k_input1_var = k_input1_var1,
k_input2_var = k_input2_var1)
return (list("r_in" = r_in,
"q_in" = q_in,
"k_in" = k_in))
}
invisible(list2env(one_run(), .GlobalEnv))
# - perform the calculations to achieve final results
result1 <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2 <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
#...
results_table <- data.frame("results1" = c("results", NA,
NA) ,
"results2" = c(NA, "results", NA),
"results3" = c("results", NA,
"results"),
row.names = c("situation1", "situation2", "situation3"))
kable(results_table, caption = "Table Caption") %>%
kable_styling("striped", full_width = F)
Table 3.1: Table Caption
|
|
results1
|
results2
|
results3
|
|
situation1
|
results
|
NA
|
results
|
|
situation2
|
NA
|
results
|
NA
|
|
situation3
|
NA
|
NA
|
results
|
Monte Carlo Simulations
sim_data1_f <- function(nsims = 1e2,
r_input1_var2,
r_input1_var2_sd,
r_input2_var2,
r_input2_var2_sd,
q_input1_var2,
q_input1_var2_sd,
q_input2_var2,
q_input2_var2_sd,
k_input1_var2,
k_input1_var2_sd,
k_input2_var2,
k_input2_var2_sd){
################
###### Draws
################
start_time <- Sys.time()
set.seed(142857)
r1_sim <- rnorm(n = nsims, mean = r_input1_var2, sd= r_input1_var2_sd)
r2_sim <- rnorm(n = nsims, mean = r_input2_var2, sd= r_input2_var2_sd)
q1_sim <- rnorm(n = nsims, mean = q_input1_var2, sd= q_input1_var2_sd)
q2_sim <- rnorm(n = nsims, mean = q_input2_var2, sd= q_input2_var2_sd)
k1_sim <- rnorm(n = nsims, mean = k_input1_var2, sd= k_input1_var2_sd)
k2_sim <- rnorm(n = nsims, mean = k_input2_var2, sd= k_input2_var2_sd)
################
###### Runs
################
result1_sim <- rep(NA, nsims) #result1
result2_sim <- rep(NA, nsims) #result2
for (i in 1:nsims){
invisible(list2env(
one_run(r_input1_var1 = r1_sim[i],
r_input2_var1 = r2_sim[i],
q_input1_var1 = q1_sim[i],
q_input2_var1 = q2_sim[i],
k_input1_var1 = k1_sim[i],
k_input2_var1 = k2_sim[i]
), .GlobalEnv))
result1_sim[i] <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2_sim[i] <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
}
total_time <- Sys.time() - start_time
return(list("result1_sim" = result1_sim,
"result2_sim" = result2_sim))
}
policy_estimates_varnames <- c(
"result1_sim",
"result2_sim"
)
policy_estimates_text <- c(
"Main Equation",
"Alternative Equation"
)
# Run Monte Carlo simulation for our main model
result1_sim_all <- sim_data1_f(nsims = nsims_so,
r_input1_var2 = r_input1_so,
r_input1_var2_sd = r_input1_so * 0.1,
r_input2_var2 = r_input2_so,
r_input2_var2_sd = r_input2_so * 0.1,
q_input1_var2 = q_input1_so,
q_input1_var2_sd = q_input1_so * 0.1,
q_input2_var2 = q_input2_so,
q_input2_var2_sd = q_input2_so * 0.1,
k_input1_var2 = k_input1_so,
k_input1_var2_sd = k_input1_so * 0.1,
k_input2_var2 = k_input2_so,
k_input2_var2_sd = k_input2_so * 0.1
)
################
###### Results/Viz
################
library(plotly)
plot1 <- generate_plot_f(result1_sim_all, policy_estimate_so, rescale_so)[[1]] +
labs(y = NULL,
x = "Main Estimate" ,
title = "Project Title",
subtitle = "Distribution of Key Indicator"
)
print(plot1)

References
LS0tDQp0aXRsZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0gJ215dGl0bGUnPlRlbXBsYXRlPC9kaXY+PC9jZW50ZXI+Ig0KZGF0ZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0nbXlzdWJ0aXRsZSc+YHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWA8L2Rpdj48L2NlbnRlcj4iDQphdXRob3I6ICI8Y2VudGVyPjxkaXYgY2xhc3MgPSAnY29udHJpYnV0b3JzJz5Db250cmlidXRvcnM8L2Rpdj48L2NlbnRlcj4iDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjc3M6IHN0eWxlLmNzcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBpbmNsdWRlczoNCiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sDQogICAga2VlcF9tZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiBubw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogbm8NCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMycNCiAgd29yZF9kb2N1bWVudDogbnVsbA0KbGluay1jaXRhdGlvbnM6IHllcw0KcGRmX2RvY3VtZW50Og0KICBleHRyYV9kZXBlbmRlbmNpZXM6IHhjb2xvcg0KICBmaWdfY2FwdGlvbjogbm8NCmJpYmxpb2dyYXBoeTogYmlibGlvZ3JhcGh5LmJpYg0KDQprbml0OiANCiAgIyByZW5kZXIgdG8gaW5kZXguaHRtbCBmb3IgR2l0SHViIHBhZ2VzDQogICMgcmVuZGVyIHRvIDA1X2ZpbmFsX29wYS5odG1sIHRvIGtuaXQgbG9jYWxseQ0KICAjIFlBTUwgZG9lcyBub3Qgc3VwcG9ydCBjb21tZW50aW5nIGluc2lkZSB0aGUgZnVuY3Rpb24NCiAgKGZ1bmN0aW9uKGlucHV0X2ZpbGUsIGVuY29kaW5nKSB7DQogIHJtYXJrZG93bjo6cmVuZGVyKGlucHV0X2ZpbGUsIGVuY29kaW5nPWVuY29kaW5nLCBvdXRwdXRfZmlsZT1maWxlLnBhdGgoIi4uIiwgJ2luZGV4Lmh0bWwnKSk7IA0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dF9maWxlLCBlbmNvZGluZz1lbmNvZGluZywgb3V0cHV0X2ZpbGU9JzAwX3RlbXBsYXRlLmh0bWwnKTsgDQogIH0pDQotLS0NClxkZWZcYmx1ZXtcY29sb3J7Ymx1ZX19DQpcZGVmXHJlZHtcY29sb3J7cmVkfX0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0gDQojIExvYWRpbmcgcmVxdWlyZWQgbGlicmFyaWVzDQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInRpZHl2ZXJzZSIsICJoZXJlIiwgImthYmxlRXh0cmEiLCAicmVhZHhsIiwicGxvdGx5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJib29rZG93biIsICJyb290U29sdmUiLCJzaGlueUJTIiwgInNoaW55dGhlbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJnZ3Bsb3QyIikNCg0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzLCByZXBvcz0gImh0dHA6Ly9jcmFuLmNuci5iZXJrZWxleS5lZHUvIikNCg0KbGFwcGx5KGxpc3Qub2YucGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCg0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBoZXJlKCkpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCnNldHdkKGhlcmUoKSkNCg0KIyBQdXJsIHRvIGFsbF9hbmFseXNpcy5SDQpvcHRpb25zKGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpICMgd29ya2Fyb3VuZCBmb3IgcHVybCBlcnJvcg0Ka25pdHI6OnB1cmwoImNvZGUvMDBfdGVtcGxhdGUuUm1kIiwgImNvZGUvc2hpbnlfYXBwL2FsbF9hbmFseXNpcy5SIikNCg0KcHJpbnRfY29kZSA8LSBUUlVFDQpgYGAgDQoNCg0KYGBge3IgcGFyYW1ldGVycywgZWNobz1wcmludF9jb2RlfQ0KIyBEbyBub3QgcnVuIGRhdGEgc2V0IG9uIGdpdC9naXRodWIgdW50aWwgcHJpdmFjeSBoYXMgYmVlbiBjbGVhcmVkDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBEYXRhICANCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFJlc2VhcmNoDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBHdWVzcyB3b3JrICAgDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyAgTm90ZXM6DQojIyMjIyMjIyMjIyMjIyMjDQojIyMgU291cmNlIC0tLS0+ICBJbnB1dCAtLS0tPiBNb2RlbCAtLS0tPiBQb2xpY3kgRXN0aW1hdGVzIChvdXRwdXQpDQojIyMgIChfc28pICAgICAgICAoX2luKSAgICAgICAoX21vKSAgICAgICAgKF9wZSkNCiMjIyB2YWx1ZXMgICAgICBmdW5jdGlvbnMgICBmdW5jdGlvbnMgICAgICB2YWx1ZXMNCiMjIyAgICAgICAgICAgICAmIHZhbHVlcyAgICAmIHZhbHVlcw0KIyMjIGFyZ3VtZW50cyBpbiBmdW5jdGlvbnMgc2hvdWxkIHVzZWQgIl92YXIiIGFuZCBmdW5jdGlvbnMgc2hvdWxkICJfZiINCiNpbnZpc2libGUoIGxpc3QyZW52KGNhbGxfcGFyYW1zX2YoKSwuR2xvYmFsRW52KSApDQoNCg0KIyBFYWNoIGFuYWx5dGljIGNvZGUgY2h1bmsgd2lsbCBiZWdpbiBieSBsaXN0aW5nIGFsbCB0aGUgaW5wdXRzIGl0IG5lZWRzLCBhbmQNCiMgdGhlIG91dHB1dHMgaXQgcHJvZHVjZXMuDQojIC0gaW5wdXRzOiBsaXN0DQojIC0gb3V0cHV0czogbGlzdA0KIyMjIyBUaGUga2V5IGVzc2VudGlhbCBhbmFseXRpYyBzdGVwcyBhcmUgd3JhcHRlZCBpbiBhIGZ1bmN0aW9uICAgDQojY2h1bmtfbmFtZV9vZl9jaHVuayA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KIw0KIyBoZXJlIGdvZXMgdGhlIGVzc2VudGlhbCBhbmFseXRpYyBjb250ZW50DQojDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQojICAgIHJldHVybiggKSAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbGlzdCB3aXRoIGFsbCB0aGUgb2JqZWN0cw0KI30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbg0KIyBUaGUgZm9sbG93aW5nIGxpbmUgZXhlY3V0ZXMgdGhlIGNvZGUgY2h1bmsgYW5kIGRlcG9zaXRzIGl0cyByZXN1bHRzDQojIGludG8gdGhlIGN1cnJlbnQgUiBlbnZpb3JubWVudDoNCiNpbnZpc2libGUoIGxpc3QyZW52KGNodW5rX25hbWVfb2ZfY2h1bmsoKSwuR2xvYmFsRW52KSApDQojDQojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoNCiMgQW55dGhpbmcgdW5kZXIgdGhpcyBjb21tZW50IGlzIHRvIGNyZWF0ZSBvYmplY3RzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGJvZHkgb2YNCiMgdGV4dC4gTm90IHRvIGJlIHVzZWQgaW4gdGhlIGZpbmFsIHJlc3VsdHMgKGNvdWxkIGJlIGRlbGV0ZWQpLiBFYWNoIG9mIHRoZXNlDQojIG9iamVjdCBzaG91bGQgZW5kIHdpdGggdGhlIHN1ZmZpeCBfdGVtcA0KDQpgYGANCg0KDQpgYGB7ciBzb3VyY2VzLCBldmFsID0gVFJVRSwgZWNobz1wcmludF9jb2RlLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyAtIGlucHV0czogbm9uZQ0KIyAtIG91dHB1dHM6IGFsbCBzb3VyY2VzIGNvbWluZyBmcm9tIGRhdGEsIHJlc2VhcmNoIGFuZCBndWVzc3dvcmsNCmNodW5rX3NvdXJjZXMgPC0gZnVuY3Rpb24oKXsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIFNldHVwDQogICAgIyMjIyMjIyMjIyMjIyAgDQogICAgbnNpbXNfc28gPC0gMWUyDQogICAgcG9saWN5X2VzdGltYXRlX3NvIDwtICJNYWluIEVxdWF0aW9uIg0KICAgIHJlc2NhbGVfc28gPC0gVFJVRQ0KICAgICMjIyMjIyMjIyMjIyMNCiAgICAjIyMjIyBEYXRhICANCiAgICAjIyMjIyMjIyMjIyMjDQogICAgDQogICMgQ3JlYXRlIG9iamVjdHMgZm9yIGRhdGEgZXh0cmFjdGVkIGZyb20gdmFyaW91cyBzb3VyY2VzDQogICAgDQogICAgcl9pbnB1dDFfc28gPC0gMC4xDQogICAgcl9pbnB1dDJfc28gPC0gMC4yDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIFJlc2VhcmNoDQogICAgIyMjIyMjIyMjIyMjIw0KICANCiAgIyBDcmVhdGUgb2JqZWN0cyBmb3IgcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSByZXNlYXJjaCBwYXBlcnMgDQogICAgcV9pbnB1dDFfc28gPC0gMC41DQogICAgcV9pbnB1dDJfc28gPC0gMC44DQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIEd1ZXNzIHdvcmsgICANCiAgICAjIyMjIyMjIyMjIyMjDQogIA0KICAjIENyZWF0ZSBvYmplY3RzIGZvciB2YXJpYWJsZXMgZnJvbSBlZHVjYXRlZCBndWVzc2VzIG9yIGVzdGltYXRlcyAgDQogIA0KDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIE5vdGVzOiANCiAgICAjIyMjIyMjIyMjIyMjDQogIA0KICAjIE5vdGVzIGZvciB0aGUgb2JqZWN0cyBkZWZpbmVkIGFib3ZlLCBpbmNsdWRpbmcgc291cmNlcywgZXhwbGFuYXRpb25zLCBldGMuIA0KICAgIGtfaW5wdXQxX3NvIDwtIDMNCiAgICBrX2lucHV0Ml9zbyA8LSA0DQogICAgDQogICAgI3JldHVybiggc2FwcGx5KCBscyhwYXR0ZXJuPSAiX3NvXFxiIiksIGZ1bmN0aW9uKHgpIGdldCh4KSkgKQ0KICAgIHJldHVybiAoDQogICAgICBsaXN0KCJuc2ltc19zbyIgPSBuc2ltc19zbywNCiAgICAgICAgICAgInBvbGljeV9lc3RpbWF0ZV9zbyIgPSBwb2xpY3lfZXN0aW1hdGVfc28sDQogICAgICAgICAgICJyZXNjYWxlX3NvIiA9IHJlc2NhbGVfc28sDQogICAgICAgICAgICJyX2lucHV0MV9zbyIgPSByX2lucHV0MV9zbywNCiAgICAgICAgICAgInJfaW5wdXQyX3NvIiA9IHJfaW5wdXQyX3NvLA0KICAgICAgICAgICAicV9pbnB1dDFfc28iID0gcV9pbnB1dDFfc28sDQogICAgICAgICAgICJxX2lucHV0Ml9zbyIgPSBxX2lucHV0Ml9zbywNCiAgICAgICAgICAgImtfaW5wdXQxX3NvIiA9IGtfaW5wdXQxX3NvLA0KICAgICAgICAgICAia19pbnB1dDJfc28iID0ga19pbnB1dDJfc28NCiAgICAgICAgICAgKQ0KICAgICkNCn0NCmludmlzaWJsZShsaXN0MmVudihjaHVua19zb3VyY2VzKCksLkdsb2JhbEVudikgKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQpTdW1tYXJ5IG9mIHRoZSBpc3N1ZSBhbmQgaW50cm9kdWN0aW9uIHRvIHRoZSBwb2xpY3kgYW5hbHlzaXMgaXMgY29uZHVjdGVkLiANCg0KVGhlIGdvYWwgb2YgdGhpcyBhbmFseXNpcyBpcyB0byBwcm92aWRlIHRoZSBiZXN0IGVtcGlyaWNhbCBpbmZvcm1hdGlvbiBmb3IgcG9saWN5IG1ha2VycyBkZWJhdGluZyB0aGUgaW1wbGVtZW50aW9uIG9mICJ4IiBwb2xpY3kuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGFsbCB0aGUgYW5hbHl0aWNhbCBzdGVwcyByZXF1aXJlZCB0byByZXByb2R1Y2UgdGhlIGFuYWx5c2lzLCBhbmQgZGlzcGxheWluZyB0aGUgYWN0dWFsIGNvbXB1dGVyIGNvZGUgdXNlIGluIGVhY2ggc3RlcC4gSW4gYWRkaXRpb24gdG8gdGhpcyByZXBvcnQsIHRoZSByZWFkZXIgY2FuIGZpbmQgYWxsIHRoZSBtYXRlcmlhbHMgdG8gcmVwcm9kdWNlIHRoZSBmaW5kaW5ncyBwcmVzZW50ZWQgaGVyZSBpbiBHaXRIdWIuIFRoZSBtYWluIG91dHB1dCwgcHJlc2VudGVkIGluIHRoZSByZXN1bHRzIHNlY3Rpb24gb2YgdGhpcyByZXBvcnQsIGNhbiBhbHNvIGJlIGV4cGxvcmVkIGludGVyYWN0aXZlbHkgZm9yIGRpZmZlcmVudCBhc3N1bXB0aW9ucyBvbiB0aGUgY29ycmVzcG9uZGluZyBzaGlueSBhcHAuIA0KDQojIyBTb3VyY2UgSW5mb3JtYXRpb24gZm9yIGRhdGEgKyBhbmFseXRpY2FsIG1ldGhvZHMNCg0KRm9yIHRoaXMgZHluYW1pYyBkb2N1bWVudCwgd2UgYXJlIGNvbmR1Y3RpbmcgdGhpcyBzcGVjaWZpYyBhbmFseXNpcywgYW5kIGl0IGlzIGNvbXB1dGVkIHVzaW5nIHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzOg0KDQoxLiBBcHByb2FjaCAxIChzb3VyY2UgbGluaykNCjIuIEFwcHJvYWNoIDIgKHNvdXJjZSBsaW5rKQ0KMy4gQXBwcm9hY2ggMyAoc291cmNlIGxpbmspDQoNCg0KDQo/Pz8gIA0KDQojIyBLZXkgcG9saWN5IGVzdGltYXRlcyBmb3IgcG9saWN5IG1ha2VycyAgDQpgYGB7cn0NCiNteSB0aG91Z2h0czogc2hvdWxkIHdlIGZvcmVmcm9udCB0aGUgY29uY2x1c2lvbnMgYmVmb3JlIHRoZSBtZXRob2RvbG9neT8gDQoNCiNTYW5kcmE6IEkgdGhpbmsgd2Ugc2hvdWxkIHNwZWNpZnkgd2hpY2ggYXBwcm9hY2ggd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBncmFwaCwgYnV0IGtlZXAgdGhlIG1ldGhvZG9sb2d5IGJlZm9yZSB0aGUgY29uY2x1c2lvbnMuIA0KYGBgDQoNCmBgYHtyIGZpbmFsLW91dHB1dH0NCmBgYA0KPz8/DQoNCiMgTWV0aG9kb2xvZ3kNCg0KRXhwbGFpbiB3aGF0IHRoZSBmaW5hbCBlc3RpbWF0ZSBpbmRpY2F0b3IgaXMsIGhvdyB0aGUgYW5hbHlzaXMgaXMgdG8gYmUgcGVyZm9ybWVkLCB3aGF0IGZhY3RvcnMgYXJlIGxvb2tlZCBhdCwgZXRjLg0KDQojIyBDb21tb24gU3RydWN0dXJlDQoNCkludHJvZHVjZSB0aGUgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBmaW5hbCBwb2xpY3kgZXN0aW1hdGUuIEluY2x1ZGUgYWx0ZXJuYXRpdmUgaW5kaWNhdG9ycyBvZiBvdXIgZmluYWwgcG9saWN5IGVzdGltYXRlcyBhcyB3ZWxsLiAgDQoNCiMjIyBNYWluIEVxdWF0aW9uICh0aGUgbW9kZWwpDQoNClxiZWdpbntlcXVhdGlvbn0NCnkgPSByICsgcSAtIGsNClxsYWJlbHtlcToxfQ0KXHRhZ3sxfQ0KXGVuZHtlcXVhdGlvbn0NCg0KIyMjIEFsdGVybmF0aXZlIEVxdWF0aW9uDQoNClxiZWdpbntlcXVhdGlvbn0NCnkgPSByICsgcSArIGsNClxsYWJlbHtlcToyfQ0KXHRhZ3syfQ0KXGVuZHtlcXVhdGlvbn0NCg0KDQpgYGB7ciB0ZXN0LCBldmFsPVRSVUV9DQojIC0gaW5wdXRzOiANCiMgLSBvdXRwdXRzOiANCmNodW5rX3Rlc3QgPC0gZnVuY3Rpb24oKXsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiAgDQogICAgIyByYW5kb20gZXF1YXRpb24gdG8gdXNlIGFzIG91ciBtYWluIGVxdWF0aW9uIHRvIGdldCB0aGUgZmluYWwgcmVzdWx0DQogICAgbWFpbmVxdWF0aW9uX2YgPC0gZnVuY3Rpb24ocl9maW5hbF92YXIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IDEpIHsNCiAgICAgICAgcmV0dXJuIChyX2ZpbmFsX3ZhciArIHFfZmluYWxfdmFyIC0ga19maW5hbF92YXIpDQogICAgfQ0KICAgIA0KICAgICMgcmFuZG9tIGVxdWF0aW9uIHRvIHVzZSBhcyBvdXIgYWx0ZXJuYXRpdmUgZXF1YXRpb24gdG8gZ2V0IHRoZSBmaW5hbCByZXN1bHQNCiAgICBhbHRlcm5hdGl2ZV9mIDwtIGZ1bmN0aW9uKCByX2ZpbmFsX3ZhciA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0gMSl7DQogICAgICByZXR1cm4gKHJfZmluYWxfdmFyICsgcV9maW5hbF92YXIgKyBrX2ZpbmFsX3ZhcikNCiAgICAgIA0KICAgIH0NCiAgICANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiAgICByZXR1cm4obGlzdCgibWFpbmVxdWF0aW9uX2YiID0gbWFpbmVxdWF0aW9uX2YsICJhbHRlcm5hdGl2ZV9mIiA9IGFsdGVybmF0aXZlX2YpKSAgICAjIFRyeSB0byByZXR1cm4gb25seSBmdW5jdGlvbnMNCn0NCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfdGVzdCgpLC5HbG9iYWxFbnYpICkNCg0KIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6DQptYWluZXF1YXRpb25faW4gPC0gbWFpbmVxdWF0aW9uX2YoKQ0KYWx0ZXJuYXRpdmVfaW4gPC0gYWx0ZXJuYXRpdmVfZigpDQpgYGANCg0KIyMgU3ViIENvbW1vbiBDb21wb25lbnRzOg0KDQojIyMgQ29tcG9uZW50IDEgKCIkciQiKQ0KDQpUaGlzIGlzIHRoZSBmb3JtdWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvbmVudCAxW14xXQ0KDQpcYmVnaW57ZXF1YXRpb259DQpyID0gWCBcdGltZXMgXGxhbWJkYV8xICArICgxIC0gWCkgXHRpbWVzIFxsYW1iZGFfMg0KXGxhYmVse2VxOjN9DQpcdGFnezN9DQpcZW5ke2VxdWF0aW9ufQ0KDQpgYGB7ciBjb21wMSwgIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogZmFjdG9ycyBvZiByDQojIC0gb3V0cHV0czogciB2YWx1ZQ0KY2h1bmtfciA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQoNCiAgICByX2Z1bmN0aW9uX2YgPC0gZnVuY3Rpb24ocl9pbnB1dDFfdmFyID0gcl9pbnB1dDFfc28gLCByX2lucHV0Ml92YXIgPSByX2lucHV0Ml9zbykgeyAgDQogICAgICAgIHJfaW5wdXQxX3ZhciAtIHJfaW5wdXQyX3Zhcg0KICAgICAgICANCiAgICB9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICAgIHJldHVybihsaXN0KCJyX2Z1bmN0aW9uX2YiID0gcl9mdW5jdGlvbl9mKSkNCn0NCg0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19yKCksLkdsb2JhbEVudikgKQ0KDQpgYGANCg0KIyMgQXBwcm9hY2ggMTogU291cmNlIE5hbWUgKHNvdXJjZSBsaW5rKQ0KIyMjIENvbXBvbmVudCAyICgiJHEkIikNCg0KVGhpcyBpcyB0aGUgZm9ybXVsYSB1c2VkIHRvIGNhbGN1bGF0ZSBjb21wb25lbnQgMlteMl0NCg0KXGJlZ2lue2VxdWF0aW9ufQ0KcSA9ICBcdGV4dHtpbnB1dH0gXHRpbWVzIFxhbHBoYV8wICgxICsgZylee1h9KDEgKyBcaGF0e1xiZXRhXzF9IFggKyBcaGF0e1xiZXRhXzJ9IFheMikNClxsYWJlbHtlcTp9DQpcdGFnezR9DQpcZW5ke2VxdWF0aW9ufQ0KDQpgYGB7ciBjb21wMiwgIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogZmFjdG9ycyBvZiBxDQojIC0gb3V0cHV0czogcSB2YWx1ZQ0KY2h1bmtfcSA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQoNCiAgICBxX2Z1bmN0aW9uX2YgPC0gZnVuY3Rpb24ocV9pbnB1dDFfdmFyID0gcV9pbnB1dDFfc28gLCBxX2lucHV0Ml92YXIgPSBxX2lucHV0Ml9zbykgeyAgDQogICAgICAgIChxX2lucHV0MV92YXIgKiBxX2lucHV0Ml92YXIpXjINCiAgICAgICAgDQogICAgfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiAgICByZXR1cm4obGlzdCgicV9mdW5jdGlvbl9mIiA9IHFfZnVuY3Rpb25fZikpDQp9DQoNCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfcSgpLC5HbG9iYWxFbnYpICkNCg0KYGBgDQoNCiMjIEFwcHJvYWNoIDI6IFNvdXJjZSBOYW1lIChzb3VyY2UgbGluaykNCiMjIyBDb21wb25lbnQgMyAoIiRrJCIpDQoNClRoaXMgaXMgdGhlIGZvcm11bGEgdXNlZCB0byBjYWxjdWxhdGUgY29tcG9uZW50IDNbXjNdDQoNClxiZWdpbntlcXVhdGlvbn0NCmsgPSBSIFx0aW1lcyBYICArICgxIC0gUikgXHRpbWVzIFgNClxsYWJlbHtlcTo1fQ0KXHRhZ3s1fQ0KXGVuZHtlcXVhdGlvbn0NCg0KDQoNCmBgYHtyIGNvbXAzLCAgZWNobz1wcmludF9jb2RlLCBldmFsPVRSVUV9DQojIC0gaW5wdXRzOiBmYWN0b3JzIG9mIHENCiMgLSBvdXRwdXRzOiBxIHZhbHVlDQpjaHVua19rIDwtIGZ1bmN0aW9uKCl7DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCg0KICAgIGtfZnVuY3Rpb25fZiA8LSBmdW5jdGlvbihrX2lucHV0MV92YXIgPSBrX2lucHV0MV9zbyAsIGtfaW5wdXQyX3ZhciA9IGtfaW5wdXQyX3NvKSB7ICANCiAgICAgICAgKGtfaW5wdXQxX3ZhciAqIGtfaW5wdXQyX3ZhcileMg0KICAgICAgICANCiAgICB9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICAgIHJldHVybihsaXN0KCJrX2Z1bmN0aW9uX2YiID0ga19mdW5jdGlvbl9mKSkNCn0NCg0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19rKCksLkdsb2JhbEVudikgKQ0KDQoNCmBgYA0KDQojIyBTdW1tYXJ5IG9mIEFsbCBBcHByb2FjaGVzIA0KDQoNCnwgQXBwcm9hY2ggICAgfCBQYXJ0IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGFydCAyICAgICAgICB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8IDEuMSB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMSB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDEgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAxICB8DQp8IDEuMiB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMSB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDIgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcnJvYWNoIDEgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAyICB8DQp8IDIuMSB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMiB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDIgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAxIHwNCnwgKioyLjIqKiB8ICoqU3BlY2lmaWNhdGlvbiBvZiBBcHByb2FjaCAyIHdpdGggUGFydCAxIEFzc3VtcHRpb24gMioqIHwgKipTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDIgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAyKip8DQoNCkJvbGRlZCByb3cgaXMgdGhlIGFzc3VtcHRpb25zIGFuZCB0aGUgYXBwcm9hY2ggd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBtYWluIHBvbGljeSBlc3RpbWF0ZSBwbG90LiANCg0KDQojIE1haW4gcmVzdWx0cw0KDQpgYGB7ciBhbGwtc3RlcHMsICBlY2hvPXByaW50X2NvZGUsIGV2YWwgPSBUUlVFfQ0KI3VuaXQgdGVzdCBmdW5jdGlvbg0KdW5pdF90ZXN0X2YgPC0gZnVuY3Rpb24odG9fdGVzdF92YXIsIG9yaWdpbmFsX3ZhciwgbWFpbl9ydW5fdmFyID0gVFJVRSl7DQogICAgaWYgKG1haW5fcnVuX3ZhciA9PSBUUlVFKSB7DQogICAgICAgIGlmIChsZW5ndGgodG9fdGVzdF92YXIpID4gMSkgew0KICAgICAgICAgICAgZmFpbHNfdGVzdCA8LSAoIGFicyhzZCh0b190ZXN0X3ZhcikgLSBvcmlnaW5hbF92YXIpID4gMC4wMDAxICkNCiAgICAgICAgICAgIHRleHRfdmFsIDwtIHNkKHRvX3Rlc3RfdmFyKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZmFpbHNfdGVzdCA8LSAoIGFicyh0b190ZXN0X3ZhciAtIG9yaWdpbmFsX3ZhcikgPiAwLjAwMDEgKQ0KICAgICAgICAgICAgdGV4dF92YWwgPC0gdG9fdGVzdF92YXINCiAgICAgICAgfQ0KICAgICAgICBpZiAoZmFpbHNfdGVzdCkgew0KICAgICAgICAgICAgcHJpbnQocGFzdGUoIk91dHB1dCBoYXMgY2hhbmdlIGF0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFyc2Uoc3Vic3RpdHV0ZSh0b190ZXN0X3ZhcikgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gIiwgdGV4dF92YWwpICkNCiAgICAgICAgfQ0KICAgICAgfQ0KfQ0KDQpvbmVfcnVuIDwtIA0KICBmdW5jdGlvbihyX2lucHV0MV92YXIxID0gcl9pbnB1dDFfc28sIA0KICAgICAgICAgICByX2lucHV0Ml92YXIxID0gcl9pbnB1dDJfc28sIA0KICAgICAgICAgICBxX2lucHV0MV92YXIxID0gcV9pbnB1dDFfc28sDQogICAgICAgICAgIHFfaW5wdXQyX3ZhcjEgPSBxX2lucHV0Ml9zbywNCiAgICAgICAgICAga19pbnB1dDFfdmFyMSA9IGtfaW5wdXQxX3NvLA0KICAgICAgICAgICBrX2lucHV0Ml92YXIxID0ga19pbnB1dDJfc28peyMgVmFyaWFibGVzIG5lZWRlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgcG9saWN5IGVzdGltYXRlcw0KICAgIA0KICAgIHJfaW4gPC0gcl9mdW5jdGlvbl9mKHJfaW5wdXQxX3ZhciA9IHJfaW5wdXQxX3ZhcjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyID0gcl9pbnB1dDJfdmFyMSkNCiAgICBxX2luIDwtIHFfZnVuY3Rpb25fZihxX2lucHV0MV92YXIgPSBxX2lucHV0MV92YXIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhciA9IHFfaW5wdXQyX3ZhcjEpDQogICAga19pbiA8LSBrX2Z1bmN0aW9uX2Yoa19pbnB1dDFfdmFyID0ga19pbnB1dDFfdmFyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIgPSBrX2lucHV0Ml92YXIxKQ0KICAgIHJldHVybiAobGlzdCgicl9pbiIgPSByX2luLA0KICAgICAgICAgICAgICAgICAicV9pbiIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAia19pbiIgPSBrX2luKSkNCiAgICAgICAgICAgfQ0KICAgIA0KaW52aXNpYmxlKGxpc3QyZW52KG9uZV9ydW4oKSwgLkdsb2JhbEVudikpDQoNCiAgICANCmBgYA0KDQoNCmBgYHtyIG1haW4tcmVzdWx0cywgIGVjaG89cHJpbnRfY29kZSwgZXZhbCA9IFRSVUV9DQojIC0gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb25zIHRvIGFjaGlldmUgZmluYWwgcmVzdWx0cw0KDQpyZXN1bHQxIDwtIG1haW5lcXVhdGlvbl9mKHJfZmluYWxfdmFyID0gcl9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IGtfaW4pDQpyZXN1bHQyIDwtIGFsdGVybmF0aXZlX2Yocl9maW5hbF92YXIgPSByX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IHFfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0ga19pbikNCiMuLi4NCg0KcmVzdWx0c190YWJsZSA8LSBkYXRhLmZyYW1lKCJyZXN1bHRzMSIgPSAgIGMoInJlc3VsdHMiLCBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSAsDQogICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0czIiID0gIGMoTkEsICJyZXN1bHRzIiwgTkEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VsdHMzIiA9IGMoInJlc3VsdHMiLCBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHRzIiksDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IGMoInNpdHVhdGlvbjEiLCAic2l0dWF0aW9uMiIsICJzaXR1YXRpb24zIikpDQoNCmthYmxlKHJlc3VsdHNfdGFibGUsIGNhcHRpb24gPSAiVGFibGUgQ2FwdGlvbiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KDQpgYGB7ciBnZW5lcmF0ZS1wbG90LWZ1bmN0aW9uLCBwdXJsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KIyBnZW5lcmF0ZV9wbG90X2Y6IGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHBsb3RzIGZvciBib3RoIER5bmFtaWMgRG9jdW1lbnQgYW5kDQojIHNoaW55IGFwcC4gSXQgdGFrZXMgaW4gdGhlIHNpbXVsYXRlZCBkYXRhLCBwb2xpY3kgZXN0aW1hdGUgdGV4dCwgYW5kIHJlc2NhbGUNCiMgdmFyaWFibGUuIFRoZXNlIGFyZSBpbnRlcm1lZGlhcnkgdmFyaWFibGVzIHRvIGV4Y2x1ZGUgdGhlIGludGVyYWN0aXZpdHkgb2YNCiMgc2hpbnkgYXBwIGZyb20gdGhlIHBsb3QgZ2VuZXJhdGlvbiBwcm9jZXNzLiAgDQpjaHVua19nZW5lcmF0ZV9wbG90IDwtIGZ1bmN0aW9uKCkgew0KICBnZW5lcmF0ZV9wbG90X2YgPC0gZnVuY3Rpb24ocmVzdWx0MV9zaW1fYWxsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X2VzdGltYXRlc190ZXh0X3NlbGVjdGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZSwgU0QgPSBGQUxTRSl7DQogICAgdG90YWxfdGltZV9zaW0gPC0gcmVzdWx0MV9zaW1fYWxsJHRvdGFsX3RpbWVfc2ltDQogICAgcG9zaXRpb24gPC0gd2hpY2goIHBvbGljeV9lc3RpbWF0ZXNfdGV4dCA9PSBwb2xpY3lfZXN0aW1hdGVzX3RleHRfc2VsZWN0ZWQpDQogICAgcmVzdWx0MV9zaW0gPC0gcmVzdWx0MV9zaW1fYWxsW1sgcG9saWN5X2VzdGltYXRlc192YXJuYW1lc1twb3NpdGlvbl0gXV0gICAgDQogICAgcmVzdWx0MV9mb3JfdGV4dCA8LSBwYXN0ZSgiTWVkaWFuIE5QVjogIiwgcm91bmQobWVkaWFuKHJlc3VsdDFfc2ltKSwgMikpDQogICAgcmVzdWx0MV9mb3JfdGV4dDIgPC0gTlVMTA0KICAgIGlmIChTRCl7DQogICAgcmVzdWx0MV9mb3JfdGV4dDIgPC0gcGFzdGUoIlNEIE5QVjogIiwgcm91bmQoc2QocmVzdWx0MV9zaW0pLCAyKSkNCiAgICB9DQogICAgcGxvdDEgPC0gZ2dwbG90KCkgKw0KICAgICAgZ2VvbV9kZW5zaXR5KA0KICAgICAgICBhZXMoeCA9IHJlc3VsdDFfc2ltLA0KICAgICAgICAgICAgYWxwaGEgPSAxIC8gMiwgLi5zY2FsZWQuLiksDQogICAgICAgIGtlcm5lbCA9ICJnYXUiLA0KICAgICAgICBsd2QgPSAxLA0KICAgICAgICBmaWxsID0gIiMwMDdiYTciLA0KICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSIsDQogICAgICAgIGFscGhhID0gMC4zDQogICAgICApICsNCiAgICAgIGdlb21fdmxpbmUoDQogICAgICAgIHhpbnRlcmNlcHQgPSBjKDAsIG1lZGlhbihyZXN1bHQxX3NpbSkpLA0KICAgICAgICBjb2wgPSBjKCJibGFjayIsICJkYXJrYmx1ZSIpLA0KICAgICAgICBsd2QgPSBjKDEsIDEpLA0KICAgICAgICBsaW5ldHlwZSA9IGMoInNvbGlkIiwgImRhc2hlZCIpDQogICAgICApICsNCiAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMzAwLDEwMDApLCAgeWxpbSA9ICBjKCAwLCAxLjIgKSkgICsgICMgZml4aW5nIHRoZSB4IGF4aXMgc28gc2hpZnRzIGluIHRoZSBkZW5zaXR5IGNhbiBiZSBzZWVuDQogICAgICAjeGxpbShyYW5nZShkZW5zaXR5KHJlc3VsdDFfc2ltKSR4KSkgKw0KICAgICAgZ3VpZGVzKGFscGhhID0gIm5vbmUiLCBjb2xvdXIgPSAibm9uZSIpICsNCiAgICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMCkpKSArDQogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKw0KICAgICAgYW5ub3RhdGUoDQogICAgICAgICJ0ZXh0IiwNCiAgICAgICAgeCA9IDEgKiBtZWRpYW4ocmVzdWx0MV9zaW0pLA0KICAgICAgICB5ID0gMC4yLA0KICAgICAgICBsYWJlbCA9IHJlc3VsdDFfZm9yX3RleHQsDQogICAgICAgIHNpemUgPSA2LA0KICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSINCiAgICAgICkgKw0KICAgICAgYW5ub3RhdGUoDQogICAgICAgICJ0ZXh0IiwNCiAgICAgICAgeCA9IDEgKiBtZWRpYW4ocmVzdWx0MV9zaW0pLA0KICAgICAgICB5ID0gMC4xLA0KICAgICAgICBsYWJlbCA9IHJlc3VsdDFfZm9yX3RleHQyLA0KICAgICAgICBzaXplID0gNiwNCiAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiDQogICAgICApICsNCiAgICAgIHRoZW1lKA0KICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjUpDQogICAgICApDQoNCiAgICBpZiAocmVzY2FsZSA9PSBUUlVFKSB7DQogICAgICBwbG90MSA8LQ0KICAgICAgICBzdXBwcmVzc01lc3NhZ2VzKHBsb3QxICsgY29vcmRfY2FydGVzaWFuKHhsaW0gPSAxLjIgKiBjKG1pbihjKA0KICAgICAgICAgIC0xLCByZXN1bHQxX3NpbQ0KICAgICAgICApKSwgbWF4KGMoDQogICAgICAgICAgMTAwLCByZXN1bHQxX3NpbQ0KICAgICAgICApKSkpKQ0KICAgIH0NCiAgICByZXR1cm4gKGxpc3QocGxvdDEscG9zaXRpb24sdG90YWxfdGltZV9zaW0pKQ0KfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXR1cm4obGlzdCgiZ2VuZXJhdGVfcGxvdF9mIiA9IGdlbmVyYXRlX3Bsb3RfZikpDQp9DQoNCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfZ2VuZXJhdGVfcGxvdCgpLC5HbG9iYWxFbnYpICkNCmBgYA0KDQojIE1vbnRlIENhcmxvIFNpbXVsYXRpb25zICANCmBgYHtyIG1jLXNldHVwLCAgZWNobz1wcmludF9jb2RlLCBldmFsID0gVFJVRX0NCg0Kc2ltX2RhdGExX2YgPC0gZnVuY3Rpb24obnNpbXMgPSAxZTIsDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDFfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0MV92YXIyX3NkLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQyX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyMl9zZCwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0MV92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQxX3ZhcjJfc2QsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDJfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0Ml92YXIyX3NkLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQxX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDFfdmFyMl9zZCwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQyX3ZhcjJfc2Qpew0KICAgICMjIyMjIyMjIyMjIyMjIyMNCiAgICAjIyMjIyMgRHJhd3MgICANCiAgICAjIyMjIyMjIyMjIyMjIyMjICANCiAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpDQogIHNldC5zZWVkKDE0Mjg1NykNCiAgcjFfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IHJfaW5wdXQxX3ZhcjIsIHNkPSByX2lucHV0MV92YXIyX3NkKQ0KICByMl9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0gcl9pbnB1dDJfdmFyMiwgc2Q9IHJfaW5wdXQyX3ZhcjJfc2QpDQogIHExX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSBxX2lucHV0MV92YXIyLCBzZD0gcV9pbnB1dDFfdmFyMl9zZCkNCiAgcTJfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IHFfaW5wdXQyX3ZhcjIsIHNkPSBxX2lucHV0Ml92YXIyX3NkKQ0KICBrMV9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0ga19pbnB1dDFfdmFyMiwgc2Q9IGtfaW5wdXQxX3ZhcjJfc2QpDQogIGsyX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSBrX2lucHV0Ml92YXIyLCBzZD0ga19pbnB1dDJfdmFyMl9zZCkNCiAgDQogIA0KICANCiAgICAgICAgICAgICAgICAgICAgICANCg0KICAgICMjIyMjIyMjIyMjIyMjIyMNCiAgICAjIyMjIyMgUnVucyAgICANCiAgICAjIyMjIyMjIyMjIyMjIyMjDQoNCiAgcmVzdWx0MV9zaW0gPC0gcmVwKE5BLCBuc2ltcykgI3Jlc3VsdDENCiAgcmVzdWx0Ml9zaW0gPC0gcmVwKE5BLCBuc2ltcykgI3Jlc3VsdDINCiAgDQogIGZvciAoaSBpbiAxOm5zaW1zKXsNCiAgICBpbnZpc2libGUobGlzdDJlbnYoDQogICAgICBvbmVfcnVuKHJfaW5wdXQxX3ZhcjEgPSByMV9zaW1baV0sDQogICAgICAgICAgICAgIHJfaW5wdXQyX3ZhcjEgPSByMl9zaW1baV0sDQogICAgICAgICAgICAgIHFfaW5wdXQxX3ZhcjEgPSBxMV9zaW1baV0sDQogICAgICAgICAgICAgIHFfaW5wdXQyX3ZhcjEgPSBxMl9zaW1baV0sDQogICAgICAgICAgICAgIGtfaW5wdXQxX3ZhcjEgPSBrMV9zaW1baV0sDQogICAgICAgICAgICAgIGtfaW5wdXQyX3ZhcjEgPSBrMl9zaW1baV0NCiAgICAgICAgICAgICAgKSwgLkdsb2JhbEVudikpDQogICAgDQogICAgcmVzdWx0MV9zaW1baV0gPC0gbWFpbmVxdWF0aW9uX2Yocl9maW5hbF92YXIgPSByX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IHFfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0ga19pbikNCiAgICByZXN1bHQyX3NpbVtpXSA8LSBhbHRlcm5hdGl2ZV9mKHJfZmluYWxfdmFyID0gcl9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IGtfaW4pDQogIH0NCiAgICB0b3RhbF90aW1lIDwtIFN5cy50aW1lKCkgLSBzdGFydF90aW1lDQogICAgcmV0dXJuKGxpc3QoInJlc3VsdDFfc2ltIiA9IHJlc3VsdDFfc2ltLA0KICAgICAgICAgICAgICAgICJyZXN1bHQyX3NpbSIgPSByZXN1bHQyX3NpbSkpDQogIA0KICANCn0NCg0KcG9saWN5X2VzdGltYXRlc192YXJuYW1lcyA8LSBjKA0KICAicmVzdWx0MV9zaW0iLA0KICAicmVzdWx0Ml9zaW0iDQopDQoNCnBvbGljeV9lc3RpbWF0ZXNfdGV4dCA8LSBjKA0KICAiTWFpbiBFcXVhdGlvbiIsDQogICJBbHRlcm5hdGl2ZSBFcXVhdGlvbiINCikNCg0KYGBgDQoNCmBgYHtyIG1jLXJ1biwgZHBpID0gNDAwLCBlY2hvID0gcHJpbnRfY29kZSwgZXZhbCA9IFRSVUV9DQojIFJ1biBNb250ZSBDYXJsbyBzaW11bGF0aW9uIGZvciBvdXIgbWFpbiBtb2RlbA0KcmVzdWx0MV9zaW1fYWxsIDwtIHNpbV9kYXRhMV9mKG5zaW1zID0gbnNpbXNfc28sIA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQxX3ZhcjIgPSByX2lucHV0MV9zbywNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0MV92YXIyX3NkID0gcl9pbnB1dDFfc28gKiAwLjEsDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyMiA9IHJfaW5wdXQyX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQyX3ZhcjJfc2QgPSByX2lucHV0Ml9zbyAqIDAuMSwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0MV92YXIyID0gcV9pbnB1dDFfc28sDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDFfdmFyMl9zZCA9IHFfaW5wdXQxX3NvICogMC4xLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhcjIgPSBxX2lucHV0Ml9zbywNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0Ml92YXIyX3NkID0gcV9pbnB1dDJfc28gKiAwLjEsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDFfdmFyMiA9IGtfaW5wdXQxX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQxX3ZhcjJfc2QgPSBrX2lucHV0MV9zbyAqIDAuMSwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIyID0ga19pbnB1dDJfc28sDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDJfdmFyMl9zZCA9IGtfaW5wdXQyX3NvICogMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMgUmVzdWx0cy9WaXoNCiMjIyMjIyMjIyMjIyMjIyMNCg0KDQpsaWJyYXJ5KHBsb3RseSkNCg0KDQpwbG90MSA8LSBnZW5lcmF0ZV9wbG90X2YocmVzdWx0MV9zaW1fYWxsLCBwb2xpY3lfZXN0aW1hdGVfc28sIHJlc2NhbGVfc28pW1sxXV0gKw0KICAgICAgbGFicyh5ID0gTlVMTCwNCiAgICAgICB4ID0gIk1haW4gRXN0aW1hdGUiICwNCiAgICAgICB0aXRsZSA9ICJQcm9qZWN0IFRpdGxlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgS2V5IEluZGljYXRvciINCiAgICAgICApIA0KcHJpbnQocGxvdDEpDQpgYGANCg0KDQoNCg0KIyBSZWZlcmVuY2VzDQoNCg0KW14xXTogTm90ZXMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uDQoNCg0KW14yXTogTm90ZXMgb24gcmVmZXJlbmNlZCBzZWN0aW9uDQoNClteM106IE5vdGVzIG9uIHJlZmVyZW5jZWQgc2VjdGlvbg0K

An Open Policy Analysis by BITSS
See a full contributors list here
opa@berkeley.edu